package 代码coding题OR模拟题;
import java.util.Arrays;
/**
 * 根据 题意 ：
 * 首先 要思考 的是  使 整个 nums 数组 变为   哪个值 才能 
 * 让 操作的 次数 最少 （一次 操作 就是 让数组的 一个 元素  加   1  或者 减去 1  ）
 * 而 最优的 策略  就是 让数组 中 所有的 数 都 （经过） 操作  变成 中位数 这个 值 那么 
 * 整个过程的 操作 就是最少的   （其实 大致 宏观 上去理解 也是正确的 ）
 */
public class leetcode462贪心技巧题 {
	public static void main(String []args) {
//		int nums [] = {1,10,2,9};
		int nums [] = {1,2};
		System.out.println(solution(nums));
	}
	// 这其实 是一道 数学 动态规划.思考题  贪心的 策略 要正确
	static int solution(int nums[]) {
		int ans = 0;
		// 数组 排序 便于 找到 中位数 
		Arrays.sort(nums);
		// 应用 折中的 思想  
		int len = nums.length;
		int mid = len - 1  >> 1;
		// 个数 为偶数
		if((len & 1) == 0) {
			int midValue = nums[mid] + nums[mid + 1] >> 1;
			for(int i = 0 ; i < len ;i++) {
				ans += Math.abs(nums[i] - midValue);
			}
		}
		// 个数为 奇数 
		else {
			for(int i = 0;i < len ;i++) {
				ans += Math.abs(nums[i] - nums[mid]);
			}
		}
		
		return ans;
	}
	
	
	
	
	// 这是 二分法 找 值 不是 来找中位数的 
	static int binarySearch(int nums[]) {
		int l = 0;
		int r = nums.length -1;
		while(l < r) {
			int mid = l + (r - l >> 1);
//			if(nums[mid] == )
		}
		return 0;
		
	}
	
	
}
